// 栈遵循先入后出的运行机制,只能在栈顶添加或者删除操作,然而数组和链表可以在任意位置进行添加和删除元素
//我们可以将栈认为是受限制的数组或者链表,换句话说,我们可以屏蔽数组或者链表的部分无关操作,让起对外只表现出符合栈的特性

class MyStackForArray { //定义一个自己的栈类----数组实现
    constructor(){
        this.items = []; //定义一个数组用来存储栈中的元素
    }

    push(element){ //push入栈操作
        this.items.push(element);
    };

    pop(){ //pop出栈操作
        return this.items.pop(); 
    };

    peek(){ //peek访问栈顶元素操作
        return this.items[this.items.length - 1];
    };
    
    isEmpty(){ //isEmpty判断栈是否为空操作
        return this.items.length === 0;
    };

    size(){ //size获取栈中元素个数操作
        return this.items.length;
    };
}


const myStackForArray = new MyStackForArray();
console.log(myStackForArray.isEmpty());
myStackForArray.push(1);
myStackForArray.push(2);
myStackForArray.push(3);
console.log(myStackForArray.peek()); //访问栈顶元素
console.log(myStackForArray.pop()); //出栈
console.log(myStackForArray.isEmpty());
console.log(myStackForArray.size()); //获取栈中元素个数